package com.example.demo.AppUtil;

import cn.hutool.core.util.StrUtil;
import com.example.demo.config.ben.ImgUpload;
import com.example.demo.config.ben.YamiShopBindException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.Objects;

/*
 * @Author:大力王
 * @Date:2024/6/2-02-22:30
 * 开始了
 */

/**
 * 图片上传工具类
 * 用于处理图片的上传、删除等操作，依赖于ImgUpload服务来获取上传配置信息。
 */
@Component
public class ImgUploadUtil {
    /**
     * 依赖注入ImgUpload服务，用于获取图片上传相关配置。
     */
    @Autowired
    private ImgUpload imgUpload;

    /**
     * 获取图片上传类型。
     *
     * @return 图片上传类型的整数表示。
     * @throws YamiShopBindException 如果未配置上传类型，则抛出异常。
     */
    public Integer getUploadType() {
        Integer uploadType = imgUpload.getUploadType();
        if (Objects.isNull(uploadType)) {
            throw new YamiShopBindException("请配置图片存储方式");
        }
        return uploadType;
    }

    /**
     * 获取图片上传路径。
     *
     * @return 图片上传的路径字符串。
     * @throws YamiShopBindException 如果未配置上传路径，则抛出异常。
     */
    public String getUploadPath() {
        String imagePath = imgUpload.getImagePath();
        if (Objects.isNull(imagePath) || StrUtil.isBlank(imagePath)) {
            throw new YamiShopBindException("请配置图片存储路径");
        }
        return imagePath;
    }

    /**
     * 获取图片资源的URL。
     *
     * @return 图片资源的URL字符串。
     * @throws YamiShopBindException 如果未配置资源URL，则抛出异常。
     */
    public String getResourceUrl() {
        String resourceUrl = imgUpload.getResourceUrl();
        if (Objects.isNull(resourceUrl) || StrUtil.isBlank(resourceUrl)) {
            throw new YamiShopBindException("请配置图片路径");
        }
        return resourceUrl;
    }

    /**
     * 上传图片文件。
     *
     * @param img      待上传的图片文件。
     * @param fileName 文件名。
     * @return 上传后的文件名。
     * @throws YamiShopBindException 如果创建目录失败或图片上传失败，则抛出异常。
     */
    public String upload(MultipartFile img, String fileName) {
        String filePath = imgUpload.getImagePath();
        File file = new File(filePath + fileName);
        if (!file.exists()) {
            boolean result = file.mkdirs();
            if (!result) {
                throw new YamiShopBindException("创建目录：" + filePath + "失败");
            }
        }
        try {
            img.transferTo(file);
        } catch (IOException e) {
            throw new YamiShopBindException("图片上传失败");
        }
        return fileName;
    }

    /**
     * 删除指定文件名的图片。
     *
     * @param fileName 要删除的文件名。
     */
    public void delete(String fileName) {
        String filePath = imgUpload.getImagePath();
        File file = new File(filePath + fileName);
        file.deleteOnExit();
    }
}

